package bit_pratice.day9;

/**
 * 给定两个int A和B
 * 编写一个函数返回A+B的值
 * 但不得使用+或其他算数运算符
 **/

/**
 * 分析：不使用算数运算符，我们考虑到位运算符
 * 1.不存在进位时，任意两个数位运算异或的值等于两个数相加的值
 *  * 0001
 *  * 0010
 *  * 0011:3//对应位异或
 * 2.两个数相与再左移一位=进位值
 * 存在进位情况时
 * 3+2
 * A：0011
 * B：0010
 * x=0011^0010=0001
 * y=(0011&0010)<<1=0010
 * 进位值为0时（即没有进位）对应的两个数的异或结果即最开始两个数相加的结果
 * A=x^y=0011
 * B=(x&y)<<1=0000
 * 此时A结果即为应该得到的结果
 */

/**
 * 0001
 * 0010
 * 0011:3//对应位异或
 */
public class 另类加法 {
    public int addAB(int A, int B) {
        //A:0011;B:0010=>异或
        //循环结束条件：B=0时
        if(B==0){
            return A;//先判断B值是否为0，是相加的结果直接是A
        }
        int yihuo=0;
        while(B>0){
            yihuo=A^B;
            B=(A&B)<<1;
            A=yihuo;
        }
//       或者：
//       int x=0,y=0;
//        while(B>0){
//            x=A^B;
//            y=(A&B)<<1;
//            A=x;
//            B=y;
//        }
            return A;
    }
}
